package base.exa03_bitCalAndFor;

import java.util.Scanner;

/**
 * 位计算学习，学习位运算可以有效的帮助我们写出高效的计算程序
 */
public class Demo1_BitCalStudy {

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        while (true) {
            String text = "输入下列指令来查看不同运算的示例：\n" +
                    "1: 逻辑或运算 \n" +
                    "2: 逻辑与运算 \n" +
                    "3: 按位与运算 \n" +
                    "4: 按位或运算\n" +
                    "5: 按位非运算\n" +
                    "6: 按位异或运算\n" +
                    "7: 按位右移运算\n" +
                    "8: 按位左移运算\n" +
                    "exit: 退出程序";

            System.out.println(text);

            String cmd = input.nextLine().trim();
            if("1".equals(cmd)) {
                logicOrCalculate();
            }
            if("2".equals(cmd)) {
                logicAndCalculate();
            }
            if("3".equals(cmd)) {
                andStudy();
            }
            if("4".equals(cmd)) {
                orStudy();
            }
            if("5".equals(cmd)) {
                nonStudy();
            }
            if("6".equals(cmd)) {
                nonOrStudy();
            }
            if("7".equals(cmd)) {
                rightMoveStudy();
            }
            if("8".equals(cmd)) {
                leftMoveStudy();
            }
            if("exit".equals(cmd)) {
                break;
            }
        }
    }

    /**
     * 逻辑或运算，通过或运算可以写出高效的判断程序
     * 对于或运算只需要记住一点：只要有一个为true,或运算的结果就是true
     * 否则位false
     */
    public static void logicOrCalculate() {
        System.out.println("true||false = "+ (true||false));
        System.out.println("false||false = "+(false||false));
        System.out.println("true||true = "+(true||true));
    }

    /**
     * 逻辑与运算，通过逻辑与运算可以写出高效的判断程序
     * 规则如下：判断条件都为true,与运算的结果才为true,否则为false
     */
    public static void logicAndCalculate() {
        System.out.println("true && false = " + (true && false));
        System.out.println("true && true = " + (true && true));
        System.out.println("false && false = " + (false && false));
    }

    /**
     * 按位与运算: 有0为0，无0为1
     */
    public static void andStudy(){
        //这里使用的api可以将二进制转为10进制
        int num = Integer.parseInt("00000111",2);
        int num1 =Integer.parseInt("10101011",2);
        int result = num&num1;
        System.out.println("00000111&10101011= "+Integer.toBinaryString(result));
    }

    /**
     * 按位或运算: 有1为1，无1为0
     */
    public static void orStudy(){
        //这里使用的api可以将二进制转为10进制
        int num = Integer.parseInt("00000111",2);
        int num1 =Integer.parseInt("10101011",2);
        int result = num|num1;
        System.out.println("00000111 | 10101011= "+Integer.toBinaryString(result));
    }

    /**
     * 按位非运算：1变0，0变1
     */
    public static void nonStudy(){
        //这里使用的api可以将二进制转为10进制
        int num = Integer.parseInt("00000111",2);
        int result = ~num;
        System.out.println("~00000111 = "+Integer.toBinaryString(result));
    }

    /**
     * 异或运算: 相同为0，不同为1
     */
    public static void nonOrStudy(){
        //这里使用的api可以将二进制转为10进制
        int num = Integer.parseInt("00000111",2);
        int num1 =Integer.parseInt("10101011",2);
        int result = num^num1;
        System.out.println("00000111 ^ 10101011= "+Integer.toBinaryString(result));
    }

    /**
     * 按位右移： 数会变小
     */
    public static void rightMoveStudy(){
        int num = Integer.parseInt("00000111",2);
        int result = num>>1;
        System.out.println("00000111>>1 = "+Integer.toBinaryString(result));
        int result2 = num>>>1;
        System.out.println("00000111>>>1 = "+Integer.toBinaryString(result2));
    }

    /**
     * 按位左移： 数字变大
     */
    public static void leftMoveStudy(){
        int num = Integer.parseInt("00000111",2);
        int result = num<<1;
        System.out.println("00000111<<1 = "+Integer.toBinaryString(result));
    }



}
